package cliente.so;

import java.rmi.RemoteException;
import java.util.List;

import javax.swing.JFrame;

import comum.rn.RNDescricaoSalaJogo;
import comum.rn.RNEstatisticas;
import comum.rn.RNInfoSalaJogo;
import comum.rn.RNJogada;
import comum.rn.RNPeca;
import comum.so.exception.FalhaComunicacaoBancoDadosException;
import comum.so.exception.FalhaValidacaoException;
import comum.so.exception.JaExistePerfilCadastradoComEsseLoginException;
import comum.so.exception.LoginEmUsoException;
import comum.so.exception.SalaCheiaException;
import comum.so.exception.SalaComNomeJaExistenteException;
import comum.so.exception.SalaNaoExisteException;
import comum.so.exception.SenhaIncorretaException;

public interface SOClienteSaida {
	String getIdentificador();

	void fazerLogin(String nome, String senha) throws RemoteException,
			FalhaValidacaoException, LoginEmUsoException,
			FalhaComunicacaoBancoDadosException;

	void deslogar() throws RemoteException;

	void cadastrarNovoPerfil(String nome, String senha) throws RemoteException,
			JaExistePerfilCadastradoComEsseLoginException;

	List<RNDescricaoSalaJogo> buscarSalasJogo(boolean mostrarCheios,
			boolean mostrarSenha) throws RemoteException;

	RNInfoSalaJogo entrarSalaJogo(Long idSalaJogo, String senha)
			throws RemoteException, SalaCheiaException, SalaNaoExisteException,
			SenhaIncorretaException;

	RNInfoSalaJogo criarSalaJogo(String nome, String senha)
			throws RemoteException, SalaComNomeJaExistenteException;

	RNEstatisticas obterEstatisticas() throws RemoteException;

	void sairSalaEspera(Long idSalaJogo) throws RemoteException;

	void desistirJogo(Long idSalaJogo) throws RemoteException;

	boolean entrarMesa(int posicaoDesejada, Long idSalaJogo)
			throws RemoteException;

	void sairMesa(Long idSalaJogo) throws RemoteException;

	void fazerJogada(Long idSalaJogo, RNJogada jogada) throws RemoteException;

	void iniciarPartida(String identificadorAdministrador, Long idSalaJogo)
			throws RemoteException;

	void informarEntradaJogador(String jogadorQueEntrou,
			RNInfoSalaJogo infoSalaJogo) throws RemoteException;

	void informarSaidaJogador(String jogadorQueSaiu,
			SOControladoraClienteIU controladoraIU, RNInfoSalaJogo infoSalaJogo)
			throws RemoteException;

	void informarMudancaMesa(Integer[] posicoesMesa);

	void informarJogada(String jogadorQueJogou, RNJogada jogada,
			String novoJogadorEmTurno);

	void informarInicioPartida(List<RNPeca> pecas, String primeiroAJogar);

	void informarFimPartida(String mensagem,
			SOControladoraClienteIU controladoraIU);

	void abrirSalaPrincipal(JFrame frame);

	void iniciarSalaJogo(RNInfoSalaJogo infoSalaJogo, JFrame frame);

}
